From: Dan Williams Date: Mon, 7 Jul 2014 21:44:44 +0000 (-0500) Subject: networkAgent: pass VPN hints to auth dialogs X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~2061 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=926de53c0cbd7ae59e89b386f8d02ae7ecde1b75;p=gnome-shell.git networkAgent: pass VPN hints to auth dialogs Indicate to NetworkManager that the Shell's agent supports VPN hints, and pass those hints to VPN auth dialogs that also indicate that they support hints. VPN plugins can request new secrets, for example if the previous ones are incorrect (eg, user mis-typed the password) or some other reason (next token code required to re-sync a hardware token). The specific secret that the VPN wants, and a VPN-specific message, are passed in hints from the plugin, to NetworkManager, to the agent (GNOME Shell) and then to the auth dialog. https://bugzilla.gnome.org/show_bug.cgi?id=737592 --- diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js index 1f40afdca..2a3412d45 100644 --- a/js/ui/components/networkAgent.js +++ b/js/ui/components/networkAgent.js @@ -380,6 +380,12 @@ const VPNRequestHandler = new Lang.Class({ argv.push('-i'); if (flags & NMClient.SecretAgentGetSecretsFlags.REQUEST_NEW) argv.push('-r'); + if (authHelper.supportsHints) { + for (let i = 0; i < hints.length; i++) { + argv.push('-t'); + argv.push(hints[i]); + } + } this._newStylePlugin = authHelper.externalUIMode; @@ -598,7 +604,9 @@ const NetworkAgent = new Lang.Class({ Name: 'NetworkAgent', _init: function() { - this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent' }); + this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent', + capabilities: NMClient.SecretAgentCapabilities.VPN_HINTS + }); this._dialogs = { }; this._vpnRequests = { }; @@ -698,16 +706,23 @@ const NetworkAgent = new Lang.Class({ let service = keyfile.get_string('VPN Connection', 'service'); let binary = keyfile.get_string('GNOME', 'auth-dialog'); let externalUIMode = false; + let hints = false; + try { externalUIMode = keyfile.get_boolean('GNOME', 'supports-external-ui-mode'); } catch(e) { } // ignore errors if key does not exist + + try { + hints = keyfile.get_boolean('GNOME', 'supports-hints'); + } catch(e) { } // ignore errors if key does not exist + let path = binary; if (!GLib.path_is_absolute(path)) { path = GLib.build_filenamev([Config.LIBEXECDIR, path]); } if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE)) - this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode }; + this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints }; else throw new Error('VPN plugin at %s is not executable'.format(path)); } catch(e) {